package com.bjsxt.userscenter.auth.service.impl;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.dubbo.rpc.RpcContext;
import com.alibaba.fastjson.JSONObject;
import com.bjsxt.userscenter.auth.dao.IAMenuDao;
import com.bjsxt.userscenter.auth.dao.IARoleMenuDao;
import com.bjsxt.userscenter.auth.pojo.AMenu;
import com.bjsxt.userscenter.auth.pojo.ARoleMenu;
import com.bjsxt.userscenter.auth.service.IAuthService;
import com.bjsxt.userscenter.common.util.ConstatFinalUtil;
import com.bjsxt.userscenter.common.util.PageInfoUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * 权限Service实现类
 * @author WangshSxt
 *
 */
@Service("authService")
public class AuthServiceImpl implements IAuthService
{
	@Resource
	private IAMenuDao menuDao ;
	@Resource
	private IARoleMenuDao roleMenuDao;
	
	@Override
	public JSONObject saveOneMenuService(AMenu menu)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		int res =  this.menuDao.save(menu);
		
		/*String str = null ; 
		str.toString() ; */
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", menu.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public AMenu findOneMenuService(Map<String, Object> condMap)
	{
		return this.menuDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneMenuService(AMenu menu)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		/*
		 * 修改的时候,邮箱不能重复
		 * 先查询一遍,如何做?
		 * ~正常的更新,邮箱不更新,下面的情况成立吗
		 * 
		 * HeadController
		 * if(res > 0 )
		 * {
		 *  成功
		 * }else
		 * {
		 *  失败
		 * }
		 * 
		 * BackController
		 * if(res > 0 )
		 * {
		 *  成功
		 * }else
		 * {
		 *  失败
		 * }
		 * 
		 * */
		int res =  this.menuDao.update(menu);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", menu.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public JSONObject deleteOneMenuService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.menuDao.delete(condMap);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	/**
	 * 实现了分页功能
	 * 实现了查询多条,不分页的功能
	 * 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密
	 * ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件????
	 * ~总条数,每页多少条
	 */
	@Override
	public List<AMenu> findCondListMenuService(PageInfoUtil pageInfoUtil,Map<String,Object> condMap)
	{
		/* 处理关键字的模糊匹配 */
		if(condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") +  "%");
		}
		if(pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<AMenu> menuList = this.menuDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() + ""));*/
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			
			/* 设置值 */
			condMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			/* 生产者消费者存储数据 */
			RpcContext rpcContext = RpcContext.getContext() ; 
			rpcContext.setAttachment("totalRecord", pageInfoUtil.getTotalRecord() + "");
			rpcContext.set("totalRecord", pageInfoUtil.getTotalRecord() + "");
			return menuList ; 
		}
		return this.menuDao.findList(condMap);
	}
	
	/**
	 * ~列出指定目录的子文件和子目录(树形结构)
	 * 
	 * <ul class="tree treeFolder collapse">
			<li><a href="tabsPage.html" target="navTab">框架面板</a>
				<ul>
					<li target="selectedObjId" rel="1"><a href="main.html" target="navTab" rel="main">我的主页</a></li>
					<li target="selectedObjId" rel="2"><a href="newPage1.html" target="navTab" rel="page1">页面一</a></li>
				</ul>
			</li>
			<li><a href="w_editor.html" target="navTab" rel="w_editor">编辑器</a></li>
		</ul>
	 */
	@Override
	public String proccedMenuTreeStr(String operType,String roleId)
	{
		ConstatFinalUtil.SYS_LOGGER.info("=====");
		/*File souFile = new File("D:/项目空间/302_20170515/11_用户中心");*/
		/*File souFile = new File("D:/项目空间/302_20170515/安装程序");
		listTreeUtil(souFile , 0);*/
		
		/* 存储结果 */
		StringBuffer sb = new StringBuffer() ; 
		
		if("roleMenu".equalsIgnoreCase(operType))
		{
			/* 有复选框 */
			sb.append("<ul class='tree treeFolder treeCheck expand' oncheck='kkk'>");
		}else
		{
			/* 木有复选框 */
			sb.append("<ul class='tree treeFolder collapse'>");
		}
		/* 查询所有的一级节点 */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.put("parentId", "0");
		List<AMenu> menusList = this.findCondListMenuService(null, condMap);
		for (Iterator iterator = menusList.iterator(); iterator.hasNext();)
		{
			AMenu menu = (AMenu) iterator.next();
			this.listMenuTreeUtil(sb,menu, 0,operType,roleId);
		}
		sb.append("</ul>");
		return sb.toString();
	}
	
	/**
	 * 列表文件的树形结构
	 * 
	 * 递归:一定出来,自己调用自己,永远出不来
	 * @param souFile
	 * @param level 第几级
	 */
	private void listTreeUtil(File souFile, int level)
	{
		/* 前置字符串 */
		String preStr = "" ; 
		for (int i = 0; i < level; i++)
		{
			preStr += "|-->" ; 
			
		}
		System.out.println(preStr + souFile.getName());
		/* 只有目录才做操作 */
		if(souFile.isDirectory())
		{
			/* 列出目录下面的File */
			File[] listFiles = souFile.listFiles();
			for (int i = 0; i < listFiles.length; i++)
			{
				File file = listFiles[i];
				/* 递归 */
				listTreeUtil(file , level + 1);
			}
		}
	}
	
	/**
	 * 列出所有的菜单树
	 * 
	 * <ul class="tree treeFolder collapse">
			<li><a href="tabsPage.html" target="navTab">框架面板</a>
				<ul>
					<li target="selectedObjId" rel="1"><a href="main.html" target="navTab" rel="main">我的主页</a>
						<ul>
							<li target="selectedObjId" rel="1"><a href="main.html" target="navTab" rel="main">我的主页</a></li>
							<li target="selectedObjId" rel="2"><a href="newPage1.html" target="navTab" rel="page1">页面一</a>
								<ul>
									<li target="selectedObjId" rel="1"><a href="main.html" target="navTab" rel="main">我的主页</a></li>
									<li target="selectedObjId" rel="2"><a href="newPage1.html" target="navTab" rel="page1">页面一</a></li>
								</ul>
							</li>
						</ul>
					</li>
					<li target="selectedObjId" rel="2"><a href="newPage1.html" target="navTab" rel="page1">页面一</a></li>
				</ul>
			</li>
			<li><a href="w_editor.html" target="navTab" rel="w_editor">编辑器</a></li>
		</ul>
	 * 
	 * @param souFile
	 * @param level
	 */
	private void listMenuTreeUtil(StringBuffer sb ,AMenu menu, int level,String operType,String roleId)
	{
		/* 前置字符串 */
		String preStr = "" ; 
		for (int i = 0; i < level; i++)
		{
			preStr += "|-->" ; 
			
		}
		/*System.out.println(preStr + menu.getName());*/
		if("roleMenu".equalsIgnoreCase(operType))
		{
			/* 有复选框
			 * <li><a tname="name" tvalue="value1" checked="true">我的主页</a></li>
			 * 
			 * 有权限的时候才能加上选中的效果
			 * 判断是否有权限应该去查询中间表:roleMenu
			 * 根据roleId和MenuId一块查询中间表,如果能够查询到说明有权限,如果查询不到,说明木有权限
			 *  */
			/* 根据RoleId和MenuId,查询中间表 */
			Map<String, Object> condMap = new HashMap<String, Object>();
			condMap.put("menuId", menu.getId());
			condMap.put("roleId", roleId);
			/* 分页的目的是为了获取总记录数 */
			PageInfoUtil pageInfoUtil = new PageInfoUtil() ; 
			this.findCondListRoleMenuService(pageInfoUtil, condMap);
			
			/*  */
			if(pageInfoUtil.getTotalRecord() > 0)
			{
				sb.append("<li><a tname='menuId' tvalue='"+ menu.getId() +"' checked='true'>"+ menu.getName() +"</a>");
			}else
			{
				sb.append("<li><a tname='menuId' tvalue='"+ menu.getId() +"'>"+ menu.getName() +"</a>");
			}
		}else
		{
			/* 木有复选框 */
			sb.append("<li><a href='tabsPage.html' target='navTab' rel='menuUpdate'>"+ menu.getName() +"</a>");
		}
		/* 自己调用自己呢? */
		if(menu.getChildrenMenuList().size() > 0 )
		{
			sb.append("<ul>");
			for (Iterator iterator = menu.getChildrenMenuList().iterator(); iterator.hasNext();)
			{
				AMenu childMenu = (AMenu) iterator.next();
				this.listMenuTreeUtil(sb,childMenu, level + 1,operType,roleId);
			}
			sb.append("</ul>");
		}
		sb.append("</li>");
	}
	
	@Override
	public JSONObject saveOneRoleMenuService(ARoleMenu roleMenu)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		int res =  this.roleMenuDao.save(roleMenu);
		
		/*String str = null ; 
		str.toString() ; */
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", roleMenu.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public ARoleMenu findOneRoleMenuService(Map<String, Object> condMap)
	{
		return this.roleMenuDao.findOne(condMap);
	}

	@Override
	public JSONObject updateOneRoleMenuService(ARoleMenu roleMenu)
	{
		JSONObject resultJSON = new JSONObject() ; 
		
		int res =  this.roleMenuDao.update(roleMenu);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
			
			JSONObject dataJSON = new JSONObject() ; 
			/* id */
			dataJSON.put("id", roleMenu.getId());
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("1"));
		}
		return resultJSON ; 
	}

	@Override
	public JSONObject deleteOneRoleMenuService(Map<String, Object> condMap)
	{
		JSONObject resultJSON = new JSONObject() ; 
		int res =  this.roleMenuDao.delete(condMap);
		
		if(res > 0 )
		{
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", "成功");
			
			JSONObject dataJSON = new JSONObject() ; 
			/* 影响的条数 */
			dataJSON.put("effect", res);
			
			resultJSON.put("data", dataJSON);
		}else
		{
			/* 失败 */
			resultJSON.put("code", "1");
			resultJSON.put("info", "失败");
		}
		return resultJSON ; 
	}

	/**
	 * 实现了分页功能
	 * 实现了查询多条,不分页的功能
	 * 如何让两种情况并存,都支持
	 * 
	 * ~Page这个对象和Mybatis插件绑定紧密
	 * ~将来如果换成其它的dao框架,分页就无法使用
	 * ~所有在jsp页面上写的代码都要改(Page里面的属性和其它框架的分页方法的属性不一样)
	 * 
	 * ~要想分页,有两个必备条件????
	 * ~总条数,每页多少条
	 */
	@Override
	public Map<String,Object> findCondListRoleMenuService(PageInfoUtil pageInfoUtil,Map<String,Object> condMap)
	{
		Map<String, Object> resultMap = new HashMap<String, Object>();
		/* 处理关键字的模糊匹配 */
		if(condMap.get("keyword") != null)
		{
			condMap.put("keyword", "%" + condMap.get("keyword") +  "%");
		}
		if(pageInfoUtil != null)
		{
			/* 分页查询 */
			Page page = PageHelper.startPage(pageInfoUtil.getCurrentPage(), pageInfoUtil.getPageSize());
			List<ARoleMenu> roleMenuList = this.roleMenuDao.findList(condMap);
			/* 分页的两个要素 */
			/* 分页的总记录数 */
			/*pageInfoUtil.setTotalRecord(Integer.valueOf(page.getTotal() + ""));*/
			pageInfoUtil.setTotalRecord(Long.valueOf(page.getTotal()).intValue());
			
			/* 设置值 */
			condMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			/* 生产者消费者存储数据 */
			RpcContext rpcContext = RpcContext.getContext() ; 
			rpcContext.setAttachment("totalRecord", pageInfoUtil.getTotalRecord() + "");
			rpcContext.set("totalRecord", pageInfoUtil.getTotalRecord() + "");
			
			resultMap.put("list", roleMenuList);
			resultMap.put("totalRecord", pageInfoUtil.getTotalRecord());
			resultMap.put("pageInfoUtil", pageInfoUtil);
			return resultMap ; 
		}
		List<ARoleMenu> roleMenuList = this.roleMenuDao.findList(condMap) ; 
		resultMap.put("list", roleMenuList);
		return resultMap;
	}
}
